

/**
 将字符串分割成结构体
 */
// (1) 将结构体字段声明为String，那么在创建一个结构体是需要为每一个字段分配内存空间
//
// struct Url {
//     protocol: String,
//     host: String,
//     path: String,
//     query: String,
//     fragment: String
// }
//
// impl Url {
//     fn println(&self) {
//         println!("protocol: {}, host: {}, path: {}, query: {}, fragment: {}", self.protocol, self.host, self.path, self.query, self.fragment);
//     }
// }
//
// fn main() {
//
//     let url_str = "https://www.baidu.com/index?aa=1#tag";
//
//     let url = Url {
//         protocol: url_str[0..5].to_string(),
//         host: url_str[8..21].to_string(),
//         path: url_str[22..27].to_string(),
//         query: url_str[28..32].to_string(),
//         fragment: url_str[33..36].to_string()
//     };
//
//     url.println();
//
//
// }

///////////////////////////////////////////////////////////////////////////////////////////////////

// (2) 将结构体字段声明为引用，那么在创建一个结构体时不需要为每一个字段分配内存空间

// 由于结构体中的字段是引用，所以需要生命周期参数
// 这几个字段都来自于一个字符串，所以生命周期参数是相同的
struct Url<'a> {
    protocol: &'a str,
    host: &'a str,
    path: &'a str,
    query: &'a str,
    fragment: &'a str
}

impl<'a> Url<'a> {
    fn println(&self) {
        println!("protocol: {}, host: {}, path: {}, query: {}, fragment: {}", self.protocol, self.host, self.path, self.query, self.fragment);
    }
}

/**
struct Request {
    url: Url,  // err：expected named lifetime parameter
}
*/

    struct Request<'a> {
        url: Url<'a>,
    }




fn test1(a:&str) -> &str {
    a
}

// 必须要声明生命周期参数
fn test2<'a>(a:&'a str, b:&'a str) -> &'a str {
    if a.len() > b.len() {
        a
    } else {
        b
    }
}



fn main() {

    let url_str = "https://www.baidu.com/index?aa=1#tag";

    let url = Url {
        protocol: &url_str[0..5],
        host: &url_str[8..21],
        path: &url_str[22..27],
        query: &url_str[28..32],
        fragment: &url_str[33..36],
    };

    url.println();

    let a = test1(&url_str[0..5]);
    println!("{}", a);

    let a = test2("aa","bb");
    println!("{}", a);
}